#! /usr/bin/env python
# -*- coding: utf-8 -*-

# *************************************************************
#     Filename @  flaskr.py
#       Author @  Huoty
#  Create date @  2015-12-09 15:17:36
#  Description @
# *************************************************************

import os
import sqlite3
from flask import Flask, request, session, g, redirect, url_for, \
        abort, render_template, flash
from contextlib import closing

# configuration
DATABASE = '/tmp/flaskr.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'

# create our little application :)
app = Flask(__name__)  # __name__ 表示本文件对象，即文件本身
app.config.from_object(__name__)  # 载入配置

# connect database
def connect_db():
    return sqlite3.connect(app.config['DATABASE'])

# initialize database
def init_db():
    with closing(connect_db()) as db:
        with app.open_resource("schema.sql", mode="r") as f:
            db.cursor().executescript(f.read())
        db.commit()

@app.before_request
def before_request():
    g.db = connect_db()

@app.teardown_request
def teardown_request(exception):
    db = getattr(g, 'db', None)
    if db is not None:
        db.close()
    g.db.close()

@app.route("/")
def show_entries():
    cur = g.db.execute("select title, text from entries order by id desc")
    entries = [ dict(title = row[0], text = row[1]) for row in cur.fetchall() ]
    return render_template("show_entries.html", entries = entries)

@app.route("/add", methods=["POST"])
def add_entry():
    if not session.get("logged_in"):
        abort(401)
    g.db.execute("insert into entries (title, text) values (?, ?)", [request.form["title"], request.form["text"]])
    g.db.commit()
    flash("New entry was successfully posted")
    return redirect(url_for("show_entries"))

@app.route("/login", methods=["GET", "POST"])
def login():
    error = None
    if request.method == 'POST':
        if request.form["username"] != app.config["USERNAME"]:
            error = "Invalid username"
        elif request.form["password"] != app.config["PASSWORD"]:
            error = "Invalid password"
        else:
            session["logged_in"] = True
            flash("You were logged in")
            return redirect(url_for("show_entries"))
    return render_template("login.html", error=error)

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You were logged out')
    return redirect(url_for('show_entries'))

# Script starts from here

if __name__ == '__main__':
    if not os.path.exists(app.config['DATABASE']):
        init_db()
    app.run(port=12318)
